package com.example.springboot_demo.service;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.example.springboot_demo.mappers.AllSchoolMapper;
import com.example.springboot_demo.pojo.AllSchool;
import com.example.springboot_demo.pojo.JielongExport;
import com.example.springboot_demo.pojo.JielongInfo;
import com.example.springboot_demo.pojo.SchoolZone;
import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;

@Component
public class ExcelUtils {

    List<String> userAgent = Arrays.asList("Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;AvantBrowser)",
            "Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;360SE)",
            "Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;Trident/4.0;SE2.XMetaSr1.0;SE2.XMetaSr1.0;.NETCLR2.0.50727;SE2.XMetaSr1.0)",
            "Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;TheWorld)",
            "Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;TencentTraveler4.0)",
            "Opera/9.80(Macintosh;IntelMacOSX10.6.8;U;en)Presto/2.8.131Version/11.11",
            "Mozilla/5.0(WindowsNT6.1;rv:2.0.1)Gecko/20100101Firefox/4.0.1",
            "Mozilla/5.0(compatible;MSIE9.0;WindowsNT6.1;Trident/5.0",
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60",
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36",
            "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)",
            "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0",
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36",
            "Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10",
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1",
            "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
            "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
            "Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
            "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
            "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
            "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",
            "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
            "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
            "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
            "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
            "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
            "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5",
            "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6",
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
            "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20",
            "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52");

    public static void main(String[] args) {

        ArrayList<JielongInfo> list = new ArrayList<>();
        try {
            EasyExcel.read(new File("/Users/jiangan/Downloads/jielong.xlsx"), JielongInfo.class, new AnalysisEventListener<JielongInfo>() {

                @Override
                public void invoke(JielongInfo batchWxActInfo, AnalysisContext analysisContext) {
                    list.add(batchWxActInfo);
                }

                @Override
                public void doAfterAllAnalysed(AnalysisContext analysisContext) {

                }
            }).doReadAll();
        } catch (Exception e) {

        }
        HashMap<Long, List<JielongInfo>> map = new HashMap<>();
        long time = 1654012800000L;
        Date date = new Date(time);
        for (long i = time; i < 1660285655768L; i += 86400000) {
            for (JielongInfo jielong : list) {
                long tadayStart = i;
                long todayEnd = i + 86400000;
                //接龙属于当天
                if (jielong.getEnd() > tadayStart && jielong.getStart() < todayEnd) {
                    map.computeIfAbsent(i, key -> new ArrayList<>()).add(jielong);
                }
            }
        }
        SimpleDateFormat simpleFormatter = new SimpleDateFormat("yyyy-MM-dd");
        ArrayList<JielongExport> res = new ArrayList<>();
        for (Map.Entry<Long, List<JielongInfo>> entry : map.entrySet()) {
            if (entry.getValue() != null) {
                JielongExport jielongExport = new JielongExport();
                jielongExport.setDate(simpleFormatter.format(new Date(entry.getKey())));
                List<JielongInfo> thisList = entry.getValue();
                jielongExport.setJielong(thisList.size());
                jielongExport.setStore((int) thisList.stream().filter(distinctByKey(JielongInfo::getStoreId)).count());
                res.add(jielongExport);
            }
        }
        res.sort(Comparator.comparing(o -> -o.getJielong()));
        ByteArrayOutputStream os = new ByteArrayOutputStream();

        EasyExcel.write(new File("/Users/jiangan/Desktop/export.xlsx"), JielongExport.class).sheet("sheet1").doWrite(res);
    }


    private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
        Map<Object, Boolean> seen = new ConcurrentHashMap<>();
        return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
    }


    @Autowired
    AllSchoolMapper allSchoolMapper;

    public void dealZone() {
        ArrayList<SchoolZone> list = new ArrayList<>();
        for (AllSchool item : allSchoolMapper.findAll()) {
            Map baikeData = item.getBaikeData();
            String dizi = (String) baikeData.get("地 址");
            if (StringUtils.isNotBlank(dizi)) {
                if (dizi.contains("校区") || dizi.contains("本部") || dizi.contains("校部") || dizi.contains("院区") || dizi.contains("学院")) {
                    String[] arr = dizi.split(" ");
                    for (String s : arr) {
                        if (s.contains("校区）") || s.contains("院）") || s.contains("部）")) {
                            //校区在后面
                            int start = s.indexOf("（");
                            int end = s.indexOf("）");
                            SchoolZone zone = new SchoolZone();
                            zone.setName(item.getSchName());
                            zone.setSchoolId(item.getId());
                            zone.setZone(s.substring(start + 1, end));
                            zone.setAddress(s.substring(0, start));
                            list.add(zone);
                        } else if (s.contains("校区)") || s.contains("院)") || s.contains("部)")) {
                            //校区在后面
                            int start = s.indexOf("(");
                            int end = s.indexOf(")");
                            SchoolZone zone = new SchoolZone();
                            zone.setName(item.getSchName());
                            zone.setSchoolId(item.getId());
                            zone.setZone(s.substring(start + 1, end));
                            zone.setAddress(s.substring(0, start));
                            list.add(zone);
                        } else if (s.contains("建设中")) {
                            SchoolZone zone = new SchoolZone();
                            zone.setName(item.getSchName());
                            zone.setSchoolId(item.getId());
                            int end = s.indexOf("建设中");
                            zone.setZone(s.substring(0, end - 1));
                            zone.setAddress("建设中");
                        } else if (s.contains("校区") || s.contains("本部") || s.contains("校部") || s.contains("院区") || s.contains("学院：") || s.contains("学院:")) {
                            SchoolZone zone = new SchoolZone();
                            zone.setName(item.getSchName());
                            zone.setSchoolId(item.getId());
                            int end = s.indexOf("：");
                            if (end == -1) {
                                end = s.indexOf(":");
                            }
                            zone.setAddress(s.substring(end + 1));
                            zone.setZone(s.substring(0, end));
                            list.add(zone);
                        }
                    }
                } else {
                    SchoolZone zone = new SchoolZone();
                    zone.setName(item.getSchName());
                    zone.setSchoolId(item.getId());
                    zone.setAddress(dizi);
                    list.add(zone);
                }
            }
        }
        EasyExcel.write(new File("/Users/jiangan/Desktop/zones.xlsx"), SchoolZone.class).sheet("sheet1").doWrite(list);
    }

    public void address() {
        ArrayList<SchoolZone> list = new ArrayList<>();
        EasyExcel.read(new File("/Users/jiangan/Desktop/zones.xlsx"), SchoolZone.class, new AnalysisEventListener<SchoolZone>() {

            @Override
            public void invoke(SchoolZone batchWxActInfo, AnalysisContext analysisContext) {
                list.add(batchWxActInfo);
            }

            @Override
            public void doAfterAllAnalysed(AnalysisContext analysisContext) {

            }
        }).doReadAll();
        RestTemplate restTemplate = new RestTemplate();

        HttpHeaders headers = new HttpHeaders();
        headers.set("User-Agent", userAgent.get(RandomUtils.nextInt(0, userAgent.size() - 1)));
        headers.set("referer", "https://lbs.amap.com/tools/picker");
        HttpEntity<Object> requestEntity = new HttpEntity<>(null, headers);

        for (int i = 32; i < 200; i++) {
            try {
                SchoolZone schoolZone = list.get(i);
                String keyword = schoolZone.getName();
                if (StringUtils.isNotBlank(schoolZone.getZone())) {
                    keyword = keyword + schoolZone.getZone();
                }
                String url = "https://lbs.amap.com/_AMapService/v3/place/text?s=rsv3&key=f7d40927ba4d64fb91ebe2bb9cda0995&offset=1&page=1&keywords=" + keyword;
                ResponseEntity<Map> response = restTemplate.exchange(url, HttpMethod.GET, requestEntity, Map.class);
                Map body = response.getBody();
                System.out.println(body);
                List<Map> pois = (List<Map>) body.get("pois");
                if (pois.isEmpty()) {
                    continue;
                }
                Map map = pois.get(0);
                String pname =(String) map.get("pname");
                String cityname =(String) map.get("cityname");
                String adname = (String)map.get("adname");
                String location =(String) map.get("location");
                String[] split = location.split(",");
                String longitude = split[0];
                String latitude = split[1];
                if (schoolZone.getAddress() == null){
                    try {
                        String address = (String) map.get("address");
                        schoolZone.setAddress(address);
                    } catch (Exception ignored) {
                    }
                }
                schoolZone.setPname(pname);
                schoolZone.setCityname(cityname);
                schoolZone.setAdname(adname);
                schoolZone.setLocation(location);
                schoolZone.setLatitude(latitude);
                schoolZone.setLongitude(longitude);
                Thread.sleep(500);
            } catch (Exception e) {
                e.printStackTrace();
                break;
            }
            EasyExcel.write(new File("/Users/jiangan/Desktop/gaodeSchool.xlsx"), SchoolZone.class).sheet("sheet1").doWrite(list);
        }

    }

}
